package com.dbconnect;

import java.sql.*;
import java.util.HashSet;
import java.util.Set;


/**
 * @author zken
 * @description 测试使用JDBC方式获取元数据的连接方式
 * <p>
 * 本次测试主要是对元数据进行操作，
 * 操作方式为使用接口connection通过引入驱动包的方式来进行数据库连接Conn对象
 * 获取完成connection对象的获取
 * 完成此对象的获取之后可以通过jdbc的接口getMetaData获取元数据
 * 然后就可以进行数据库操作了
 * 这里主要是拆解了baomidou中的generator内的获取所有的表的列字段的实现，
 * 通过了解列字段的获取方式
 * 可以对每个column进行添加的注解进行自定义化。
 * @CreateDate 2024/10/17 17:11:21
 */
public class Dbconnect {

    public Connection getConnection() {
//        try {
//            Class.forName("com.mysql.cj.jdbc.Driver");
//        } catch (ClassNotFoundException e) {
//            throw new RuntimeException(e);
//        }
        // 建立与mysql数据库的链接
        Connection conn = null;
        String user = "root";
        String password = "123456";
        try {
            conn = DriverManager.getConnection("jdbc:mysql://localhost:4040/testdb?useUnicode=true", user, password);
            System.out.println("数据库链接成功");
        } catch (SQLException e) {
            System.out.println("链接数据库错误");
            throw new RuntimeException(e);
        }

        return conn;
    }


    public static void main(String[] args) {
        // 链接本数据库
        ColumnDataTypeTest.Dbconnect dbconnect = new ColumnDataTypeTest.Dbconnect();
        Connection connection = dbconnect.getConnection();
        // 获取metadata元数据对象
        try {
            // 配置信息
            String tableName = "person";

            // 临时用于存放主键的set
            Set<String> primaryKeys = new HashSet<>();

            DatabaseMetaData databaseMetaData = connection.getMetaData();
            ResultSet primaryKeysResultSet = databaseMetaData.getPrimaryKeys(null, null, tableName);

            // 获取主键的测试
            while (primaryKeysResultSet.next()) {
                String columnName = primaryKeysResultSet.getString("COLUMN_NAME");
                primaryKeys.add(columnName);
            }

            System.out.println("开始展示主键数据");
            primaryKeys.forEach(obj -> {
                System.out.println(obj);
            });

            // 获取所有列的测试
            Set<String> columns = new HashSet<String>();
            // 获取列的迭代器对象
            ResultSet columnResultSet = databaseMetaData.getColumns(null, null, tableName, "%");// 选择所有格式的列名称
            // 迭代遍历result
            while (columnResultSet.next()) {
                // 使用java.sql中的jdbc限制内容，选中column_name的方式获取所有的列名称
                String columnName = columnResultSet.getString("COLUMN_NAME");
                String typeName = columnResultSet.getString("TYPE_NAME");
                columns.add(columnName);
            }
            System.out.println("开始输出所有的列（包含主键）");
            columns.forEach(obj -> {
                System.out.println(obj);
            });

            System.out.println("测试结束！！！！");
        } catch (SQLException e) {
            System.out.println("获取元数据失败");
            throw new RuntimeException(e);
        }


    }
}
